home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / textwrap.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  5KB  |  171 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __revision__ = '$Id: textwrap.py 46863 2006-06-11 19:42:51Z tim.peters $'
  5. import string
  6. import re
  7.  
  8. try:
  9.     (True, False)
  10. except NameError:
  11.     (True, False) = (1, 0)
  12.  
  13. __all__ = [
  14.     'TextWrapper',
  15.     'wrap',
  16.     'fill']
  17. _whitespace = '\t\n\x0b\x0c\r '
  18.  
  19. class TextWrapper:
  20.     whitespace_trans = string.maketrans(_whitespace, ' ' * len(_whitespace))
  21.     unicode_whitespace_trans = { }
  22.     uspace = ord(u' ')
  23.     for x in map(ord, _whitespace):
  24.         unicode_whitespace_trans[x] = uspace
  25.     
  26.     wordsep_re = re.compile('(\\s+|[^\\s\\w]*\\w+[a-zA-Z]-(?=\\w+[a-zA-Z])|(?<=[\\w\\!\\"\\\'\\&\\.\\,\\?])-{2,}(?=\\w))')
  27.     sentence_end_re = re.compile('[%s][\\.\\!\\?][\\"\\\']?' % string.lowercase)
  28.     
  29.     def __init__(self, width = 70, initial_indent = '', subsequent_indent = '', expand_tabs = True, replace_whitespace = True, fix_sentence_endings = False, break_long_words = True):
  30.         self.width = width
  31.         self.initial_indent = initial_indent
  32.         self.subsequent_indent = subsequent_indent
  33.         self.expand_tabs = expand_tabs
  34.         self.replace_whitespace = replace_whitespace
  35.         self.fix_sentence_endings = fix_sentence_endings
  36.         self.break_long_words = break_long_words
  37.  
  38.     
  39.     def _munge_whitespace(self, text):
  40.         if self.expand_tabs:
  41.             text = text.expandtabs()
  42.         
  43.         if self.replace_whitespace:
  44.             if isinstance(text, str):
  45.                 text = text.translate(self.whitespace_trans)
  46.             elif isinstance(text, unicode):
  47.                 text = text.translate(self.unicode_whitespace_trans)
  48.             
  49.         
  50.         return text
  51.  
  52.     
  53.     def _split(self, text):
  54.         chunks = self.wordsep_re.split(text)
  55.         chunks = filter(None, chunks)
  56.         return chunks
  57.  
  58.     
  59.     def _fix_sentence_endings(self, chunks):
  60.         i = 0
  61.         pat = self.sentence_end_re
  62.         while i < len(chunks) - 1:
  63.             if chunks[i + 1] == ' ' and pat.search(chunks[i]):
  64.                 chunks[i + 1] = '  '
  65.                 i += 2
  66.                 continue
  67.             i += 1
  68.  
  69.     
  70.     def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):
  71.         space_left = max(width - cur_len, 1)
  72.         if self.break_long_words:
  73.             cur_line.append(reversed_chunks[-1][:space_left])
  74.             reversed_chunks[-1] = reversed_chunks[-1][space_left:]
  75.         elif not cur_line:
  76.             cur_line.append(reversed_chunks.pop())
  77.         
  78.  
  79.     
  80.     def _wrap_chunks(self, chunks):
  81.         lines = []
  82.         if self.width <= 0:
  83.             raise ValueError('invalid width %r (must be > 0)' % self.width)
  84.         
  85.         chunks.reverse()
  86.         while chunks:
  87.             cur_line = []
  88.             cur_len = 0
  89.             if lines:
  90.                 indent = self.subsequent_indent
  91.             else:
  92.                 indent = self.initial_indent
  93.             width = self.width - len(indent)
  94.             if chunks[-1].strip() == '' and lines:
  95.                 del chunks[-1]
  96.             
  97.             while chunks:
  98.                 l = len(chunks[-1])
  99.                 if cur_len + l <= width:
  100.                     cur_line.append(chunks.pop())
  101.                     cur_len += l
  102.                     continue
  103.                 break
  104.             if chunks and len(chunks[-1]) > width:
  105.                 self._handle_long_word(chunks, cur_line, cur_len, width)
  106.             
  107.             if cur_line and cur_line[-1].strip() == '':
  108.                 del cur_line[-1]
  109.             
  110.             if cur_line:
  111.                 lines.append(indent + ''.join(cur_line))
  112.                 continue
  113.         return lines
  114.  
  115.     
  116.     def wrap(self, text):
  117.         text = self._munge_whitespace(text)
  118.         chunks = self._split(text)
  119.         if self.fix_sentence_endings:
  120.             self._fix_sentence_endings(chunks)
  121.         
  122.         return self._wrap_chunks(chunks)
  123.  
  124.     
  125.     def fill(self, text):
  126.         return '\n'.join(self.wrap(text))
  127.  
  128.  
  129.  
  130. def wrap(text, width = 70, **kwargs):
  131.     w = TextWrapper(width = width, **kwargs)
  132.     return w.wrap(text)
  133.  
  134.  
  135. def fill(text, width = 70, **kwargs):
  136.     w = TextWrapper(width = width, **kwargs)
  137.     return w.fill(text)
  138.  
  139. _whitespace_only_re = re.compile('^[ \t]+$', re.MULTILINE)
  140. _leading_whitespace_re = re.compile('(^[ \t]*)(?:[^ \t\n])', re.MULTILINE)
  141.  
  142. def dedent(text):
  143.     margin = None
  144.     text = _whitespace_only_re.sub('', text)
  145.     indents = _leading_whitespace_re.findall(text)
  146.     for indent in indents:
  147.         if margin is None:
  148.             margin = indent
  149.             continue
  150.         if indent.startswith(margin):
  151.             continue
  152.         if margin.startswith(indent):
  153.             margin = indent
  154.             continue
  155.         margin = ''
  156.         break
  157.     
  158.     if 0 and margin:
  159.         for line in text.split('\n'):
  160.             pass
  161.         
  162.     
  163.     if margin:
  164.         text = re.sub('(?m)^' + margin, '', text)
  165.     
  166.     return text
  167.  
  168. if __name__ == '__main__':
  169.     print dedent('Hello there.\n  This is indented.')
  170.  
  171.